﻿/**
*		基本队列
*@author	吴建凰 2014年11月4日
*/
#pragma once
#include <ossList.h>
#include <ossDll.h>

class OssQueue
{
public:
	OssQueue(void);
	virtual ~OssQueue(void);

	//判断是否为空
	bool IsEmpty();

	//获取第一个节点
	OssQueue* FirstNode();

	//获取下一个节点
	OssQueue* LastNode();

	//获取下一个节点
	OssQueue* NextNode();

	//获取上一个节点
	OssQueue* PrevNode();

	//从列表中移除
	void Drop();

	//增加到末尾
	void AddToTail(OssQueue* lpq);

	//增加到开头
	void AddToHead(OssQueue* lpq);

	//NpQueue* LookupQueue();

private:
	//在两者之间增加一个节点
	void __Add(OssQueue* newNode,OssQueue* prev,OssQueue* next);
public:
	OssQueue* m_next;	//下一节点
	OssQueue* m_prev; //上一节点
};

//遍历queue_for_each_entry
#define OssQueueForEachEntry(type,node,head) for(type* node = (type*)head.FirstNode();node != &head;node =(type*) node->NextNode())

//遍历queue_for_each_entry_safe
#define OssQueueForEachEntrySafe(type,node,pos,head) \
	for(type* node = (type*)head.FirstNode(),*pos = (type*)node->NextNode();\
		node != &head;node = pos,pos = (type*)node->NextNode())
